#ifndef THREADMANEJADOR_H_
#define THREADMANEJADOR_H_

#include <queue>
#include <list>
#include <vector>
#include "Thread.h"
#include "Condition.h"
#include "Respuesta.h"
#include "Mutex.h"

class InformacionPieza;
class InterfazPeer;


class ThreadManejador: public Thread
{
private:
	InterfazPeer* interfazPeer;

	Condition *conditionCLlegada;
	queue<Respuesta*> *colaLlegada;

	Mutex *mutexPiezas;
	list<InformacionPieza*> *piezas;

	Mutex *mutexPiezasABajarOBajadas;
	list<unsigned long int> *piezasPorBajar;
	list<unsigned long int> *piezasBajadas;

	Condition* conditionChoke;
	Condition* conditionTerminoBajado;

public:
	ThreadManejador(InterfazPeer* interfazPeer, Condition *conditionCLlegada, queue<Respuesta*> *colaLlegada, Mutex *mutexPiezas, list<InformacionPieza*> *piezas, Mutex *mutexPiezasABajarOBajadas, list<unsigned long int> *piezasPorBajar, list<unsigned long int> *piezasBajadas, Condition* conditionChoke, Condition* conditionTerminoBajado);
	virtual ~ThreadManejador();

	virtual void* run();
	virtual void stop();

private:
	void agregarCandidatoPiezas(const list<unsigned long int> &idPiezas, const string &idPeer);
};

#endif /* THREADMANEJADOR_H_ */
